﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Crosland.Offline.Logic;
using Crosland.Offline.Core;
using Crosland.Offline.WinForm.Properties;
using Crosland.Framework.Base;
using Crosland.Util;

namespace Crosland.Offline.WinForm
{
    public partial class UCClienteMantenimiento : UserControl
    {
        private string codigoCliente;
        private string modoOperacion;
        private string mensaje;
        private ClienteLogic logic = new ClienteLogic();

        public event EventHandler Aceptar;

        public string CodigoCliente
        {
            get { return codigoCliente; }
            set { codigoCliente = value; }
        }
              
        public string ModoOperacion
        {
            get { return modoOperacion; }
            set { modoOperacion = value; }
        }
              

        public UCClienteMantenimiento()
        {
            InitializeComponent();            
        }

        private void UCClienteMantenimiento_Load(object sender, EventArgs e)
        {            
            this.CargarDatosGenerales();           
            if (!string.IsNullOrEmpty(this.CodigoCliente))
            {
                this.EditarCliente(this.CodigoCliente);
            }          
        }

        private void EditarCliente(string codCliente)
        {
            Cliente entity = this.logic.ObtenerCliente(codCliente);

            if (!string.IsNullOrEmpty(entity.Ktokd)) this.cboGrupoCtas.SelectedValue = entity.Ktokd;
            if (!string.IsNullOrEmpty(entity.Anred)) this.cboTratamiento.SelectedValue = entity.Anred;
            this.txtRazonSocial.Text = entity.Name1;
            this.txtApellidos.Text = entity.Name2;
            this.txtDireccion.Text = entity.Stras;
            if (!string.IsNullOrEmpty(entity.Land1)) this.cboPais.SelectedValue = entity.Land1;

            if (this.cboPais.SelectedValue.ToString() == "PE")
            {
                this.CargarDepartamentos();

                if (!string.IsNullOrEmpty(entity.Regio))
                {
                    this.cboRegion.SelectedValue = entity.Regio;
                    this.CargarPoblacion();

                    if (!string.IsNullOrEmpty(entity.Ort01))
                    {
                        this.cboPoblacion.SelectedValue = entity.Ort01;
                        this.CargarDistritos();

                        if (!string.IsNullOrEmpty(entity.Ort02))
                        {
                            this.cboDistrito.SelectedValue = entity.Ort02;
                        }
                    }
                }
            }
            
            this.txtTelefono1.Text = entity.Telf1;
            this.txtTelefono2.Text = entity.Telf2;
            this.txtEmail.Text = entity.Knurl;
            if (!string.IsNullOrEmpty(entity.Stcdt)) this.cboTipoDocumento.SelectedValue = entity.Stcdt;
            this.txtNumeroDocumento.Text = entity.Stcd1;
            if (!string.IsNullOrEmpty(entity.Kukla)) this.cboClaseClientes.SelectedValue = entity.Kukla;

            //this.cboListaAccesorios.SelectedValue = string.Empty;
            //this.cboListaRepuestos.SelectedValue = string.Empty;

            this.CodigoCliente = codCliente;
        }

        private void CargarDatosGenerales()
        {
            ParametroLogic paramLogic = new ParametroLogic();
                    
            this.cboGrupoCtas.DataSource = paramLogic.ObtenerParametrosPorCategoria("grupo.cuentas");
            this.cboTratamiento.DataSource = paramLogic.ObtenerParametrosPorCategoria("tratamiento");
            this.cboPais.DataSource = paramLogic.ObtenerParametrosPorCategoria("pais");
            this.cboTipoDocumento.DataSource = paramLogic.ObtenerParametrosPorCategoria("tipo.documento");
            this.cboClaseClientes.DataSource = paramLogic.ObtenerParametrosPorCategoria("clase.cliente");
            this.cboListaAccesorios.DataSource = paramLogic.ObtenerParametrosPorCategoria("lista.accesorios");
            this.cboListaRepuestos.DataSource = paramLogic.ObtenerParametrosPorCategoria("lista.repuestos");            
        }

        private void cboPais_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.CargarDepartamentos();
        }

        private void cboPoblacion_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.CargarDistritos();
        }

        private void cboRegion_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.CargarPoblacion();
        }


        protected void CargarDepartamentos()
        {


            if (this.cboPais.SelectedIndex > 0)
            {
                if (this.cboPais.SelectedValue.ToString() == "PE")
                {
                    this.cboRegion.DataSource = (new UbigeoLogic()).GetByListRegion().Tables[0];
                }
                else
                {
                    this.cboPoblacion.Enabled = false;
                    this.cboDistrito.Enabled = false;
                    this.cboRegion.Enabled = false;
                    this.cboPoblacion.Items.Clear();
                    this.cboRegion.Items.Clear();
                    this.cboDistrito.Items.Clear();
                }
            }
            else
            {
                if (this.cboPoblacion.DataSource == null) this.cboPoblacion.Items.Clear();
                if (this.cboRegion.DataSource == null) this.cboRegion.Items.Clear();
                if (this.cboDistrito.DataSource == null) this.cboDistrito.Items.Clear();
            }
        }

        protected void CargarDistritos()
        {
            if (this.cboPoblacion.SelectedIndex > 0)
            {
                this.cboDistrito.DataSource = (new UbigeoLogic()).GetByCriteriaDistrito(
                        this.cboPoblacion.SelectedValue.ToString()).Tables[0];
            }
            else
            {
                if (this.cboDistrito.DataSource == null) this.cboDistrito.Items.Clear();
            }
        }

        protected void CargarPoblacion()
        {
            if (this.cboRegion.SelectedIndex > 0)
            {
                this.cboPoblacion.DataSource = (new UbigeoLogic()).GetByCriteriaPoblacion(
                    this.cboRegion.SelectedValue.ToString()).Tables[0];
            }
            else 
            {
                if (this.cboPoblacion.DataSource == null) this.cboPoblacion.Items.Clear();                
                if (this.cboDistrito.DataSource == null) this.cboDistrito.Items.Clear();
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.Grabar())
                {
                    this.Aceptar(sender, e);
                }
            }
            catch(Exception  ex)
            {
                MessageBox.Show(Resources.MsgErrorGrabar +  ex.Message);
            }
        }


        protected bool Grabar()
        {
            if (this.Validar())
            {
                Cliente entity = new Cliente();

                entity.ID = this.CodigoCliente;
                entity.Ktokd = this.cboGrupoCtas.SelectedValue.ToString();
                entity.Anred = (this.cboTratamiento.SelectedIndex > 0) ?
                    this.cboTratamiento.SelectedValue.ToString() : null;
                entity.Name1 = this.txtRazonSocial.Text;
                entity.Name2 = this.txtApellidos.Text;
                entity.Stras = this.txtDireccion.Text;
                entity.StrSuppl1 = null;
                entity.StrSuppl2 = null;
                entity.Ort01 = (this.cboPoblacion.SelectedIndex > 0) ?
                    this.cboPoblacion.SelectedValue.ToString() : null;
                entity.Ort02 = (this.cboDistrito.SelectedIndex > 0) ?
                    this.cboDistrito.SelectedValue.ToString() : null;
                entity.Regio = (this.cboRegion.SelectedIndex > 0) ?
                    this.cboRegion.SelectedValue.ToString() : null;
                entity.Land1 = (this.cboPais.SelectedIndex > 0) ?
                    this.cboPais.SelectedValue.ToString() : null;
                entity.Telf1 = this.txtTelefono1.Text.Trim();
                entity.Telf2 = this.txtTelefono2.Text.Trim();
                entity.Knurl = this.txtEmail.Text.Trim();
                entity.Stcdt = this.cboTipoDocumento.SelectedValue.ToString();
                entity.Stcd1 = this.txtNumeroDocumento.Text.Trim();
                entity.Kukla = this.cboClaseClientes.SelectedValue.ToString();

                DatoComercialCliente comercial = new DatoComercialCliente();
                comercial.Konda = (this.cboListaRepuestos.SelectedIndex > 0) ?
                    this.cboListaRepuestos.SelectedValue.ToString() : null;
                comercial.Pltyp = (this.cboListaAccesorios.SelectedIndex > 0) ?
                    this.cboListaAccesorios.SelectedValue.ToString() : null;
                
                string id = this.logic.GrabarCliente(entity, comercial);
                this.CodigoCliente = id;

                return true;
            }
            else 
            {
                MessageBox.Show(mensaje);
                return false;
            }
        }

        /// <summary>
        /// Permite validar los datos del formulario
        /// </summary>
        protected bool Validar()
        {
            StringBuilder msg = new StringBuilder();

            msg.Append(Tools.ValidarCampo(this.cboGrupoCtas, "Grupo cuentas", true, TipoValidacion.Ninguno));
            msg.Append(Tools.ValidarCampo(this.txtRazonSocial, "Nombre o Razón social", true, TipoValidacion.Alfanumerico));
            msg.Append(Tools.ValidarCampo(this.txtApellidos, "Apellidos", false, TipoValidacion.Alfanumerico));
            msg.Append(Tools.ValidarCampo(this.txtDireccion, "Calle y Nro", true, TipoValidacion.Alfanumerico));
            msg.Append(Tools.ValidarCampo(this.cboTipoDocumento, "Tipo NIF", true, TipoValidacion.Ninguno));
            msg.Append(Tools.ValidarCampo(this.txtNumeroDocumento, "NIF", false, TipoValidacion.Alfanumerico));
            msg.Append(Tools.ValidarCampo(this.cboClaseClientes, "Clase cliente", true, TipoValidacion.Ninguno));
            msg.Append(Tools.ValidarCampo(this.txtEmail, "Email", false, TipoValidacion.Email));
          

            if (msg.Length > 0)
            {
                mensaje = msg.ToString();
                return false;
            }

            return true;
        }


        /// <summary>
        /// Permite limpiar los registross
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            this.LimpiarCampos();
        }

        protected void LimpiarCampos()
        {
            foreach (Control control in Controls)
            {
                if (control is TextBox)
                {
                    ((TextBox)control).Clear();
                }
                if (control is ComboBox)
                {
                    ((ComboBox)control).SelectedIndex = 0;
                }
            }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            ((Form)this.Parent).Close();
        }

        
    }
}
